;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;   Copyright (c) 2006 by RockOS.
;;   All rights reserved.
;;
;;   This software is supported by Rock Software Workroom.
;;
;;   Any bugs please contact the author with e-mail or QQ:
;;     E-mail : baobaoba520@yahoo.com.cn
;;         QQ : 59681888
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;File name   : 44b_boot.s
;;Description : main entry point for s3c44b0x cpu when powered on
;;            : 
;;            : 
;;            : 
;;            :
;;Auther      : sunxinqiu
;;History     :
;;  2006-3-15   first release.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    include ..\inc\44b.inc

    IMPORT  Main

    AREA    __ROM_Entry,CODE,READONLY
    ENTRY

    EXPORT reset
reset
    b ResetHandler
    b UndefHandler
    b SwiHandler
    b PabortHandler
    b DabortHandler
    b .
    b IrqHandler
    b FiqHandler

UndefHandler
SwiHandler
PabortHandler
DabortHandler
IrqHandler
FiqHandler
    b .

ResetHandler
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; disable all interrupts by set I_bit and F_bit in PSR
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    msr CPSR_c, #(SVC_MODE|NO_INT)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; disable watchdog
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ldr     r0,=rWTCON
    ldr     r1,=0x0
    str     r1,[r0]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Init PLL clock
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ldr r0,=rLOCKTIME            ;PLL lock time when CPU wakes up from SL_IDLE or STOP mode
    ldr r1,=0xfff
    str r1,[r0]

    ldr r0,=rPLLCON              ;PLL
    ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV)
    str r1,[r0]

    ldr r0,=rCLKCON
    ldr r1,=0x7ff8              ;;All unit block CLK enable
    str r1,[r0]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Init memory controller
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ldr     r0,=SMRDATA         ;; memory control config data
    ldmia   r0,{r1-r13}
    ldr     r0,=0x01c80000      ;BWSCON Address
    stmia   r0,{r1-r13}

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Move RW/ZI data from flash area to RAM area.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LDR r0, =|Image$$RO$$Limit|; Get pointer to ROM data
    LDR r1, =|Image$$RW$$Base| ; and RAM copy
    LDR r3, =|Image$$ZI$$Base| ; Zero init base => top of

    ;; for RW area
    CMP   r0, r1
    BEQ   %1
0   CMP   r1, r3
    LDRCC r2, [r0], #4
    STRCC r2, [r1], #4
    BCC   %0

    ;; for ZI area
1   LDR   r1, =|Image$$ZI$$Limit|
    MOV   r2, #0
2   CMP   r3, r1
    STRCC R2, [r3], #4
    BCC   %2

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Init stack for each mode.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    msr   cpsr_cxsf, #(FIQ_MODE|NO_INT)   ;;FIQ Mode
    ldr   sp, =FiqStack
    add   sp, sp, #4096

    msr   cpsr_cxsf, #(IRQ_MODE|NO_INT)   ;;IRQ Mode
    ldr   sp, =IrqStack
    add   sp, sp, #4096

    msr   cpsr_cxsf, #(SVC_MODE|NO_INT)     ;;SVC Mode
    ldr   sp, =SvcStack
    add   sp, sp, #4096

    msr   cpsr_cxsf, #(ABORT_MODE|NO_INT)   ;;Abort Mode
    ldr   sp, =AbortStack
    add   sp, sp, #4096

    msr   cpsr_cxsf, #(UNDEF_MODE|NO_INT)   ;;Undef Mode
    ldr   sp, =UndefStack
    add   sp, sp, #4096

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Back to SVC mode and enter C code.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    msr   cpsr_cxsf, #SVC_MODE|NO_INT
    b     Main

SMRDATA
    DCD 0x11111100  ;;BWSCON
    DCD 0x00000600  ;;BANKCON0
    DCD 0x00007ffc  ;;BANKCON1
    DCD 0x00007ffc  ;;BANKCON2
    DCD 0x00007ffc  ;;BANKCON3
    DCD 0x00007ffc  ;;BANKCON4
    DCD 0x00007ffc  ;;BANKCON5
    DCD 0x00018000  ;;BANKCON6
    DCD 0x00018000  ;;BANKCON7
    DCD 0x0086060e  ;;REFRESH
    DCD 0x00000010  ;;BANKSIZE
    DCD 0x00000020  ;;MRSRB6
    DCD 0x00000020  ;;MRSRB7


    AREA __mode_stack, DATA, READWRITE
UserStack   %   0       ;; stack for User/System mode.
FiqStack    %   4096    ;; stack for FIQ mode.
IrqStack    %   4096    ;; stack for IRQ mode.
SvcStack    %   4096    ;; stack for SVC mode.
AbortStack  %   4096    ;; stack for Abort mode.
UndefStack  %   4096    ;; stack for Undef mode.


    END
